home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / actionrp / lrogue0.1 / lrogue0 / rogue / use.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  12KB  |  579 lines

  1. /*
  2.  * use.c
  3.  *
  4.  * This source herein may be modified and/or distributed by anybody who
  5.  * so desires, with the following restrictions:
  6.  *    1.)  No portion of this notice shall be removed.
  7.  *    2.)  Credit shall not be taken for the creation of this source.
  8.  *    3.)  This code is not to be traded, sold, or used for personal
  9.  *         gain or profit.
  10.  *
  11.  */
  12.  
  13. #ifndef CURSES
  14. #include <curses.h>
  15. #endif CURSES
  16. #include "rogue.h"
  17.  
  18. short halluc = 0;
  19. short blind = 0;
  20. short confused = 0;
  21. short levitate = 0;
  22. short haste_self = 0;
  23. boolean see_invisible = 0;
  24. short extra_hp = 0;
  25. boolean detect_monster = 0;
  26. char *strange_feeling = "you have a strange feeling for a moment, then it passes";
  27.  
  28. extern short bear_trap;
  29. extern char hunger_str[];
  30. extern short cur_room;
  31. extern long level_points[];
  32. extern boolean being_held;
  33. extern char *fruit, *you_can_move_again;
  34. extern boolean sustain_strength;
  35.  
  36. quaff()
  37. {
  38.     short ch;
  39.     char buf[80];
  40.     object *obj;
  41.  
  42.     ch = pack_letter("quaff what?", POTION);
  43.  
  44.     if (ch == CANCEL) {
  45.         return;
  46.     }
  47.     if (!(obj = get_letter_object(ch))) {
  48.         message("no such item.", 0);
  49.         return;
  50.     }
  51.     if (obj->what_is != POTION) {
  52.         message("you can't drink that", 0);
  53.         return;
  54.     }
  55.     switch(obj->which_kind) {
  56.         case INCREASE_STRENGTH:
  57.             message("you feel stronger now, what bulging muscles!",
  58.             0);
  59.             rogue.str_current++;
  60.             if (rogue.str_current > rogue.str_max) {
  61.                 rogue.str_max = rogue.str_current;
  62.             }
  63.             break;
  64.         case RESTORE_STRENGTH:
  65.             rogue.str_current = rogue.str_max;
  66.             message("this tastes great, you feel warm all over", 0);
  67.             break;
  68.         case HEALING:
  69.             message("you begin to feel better", 0);
  70.             potion_heal(0);
  71.             break;
  72.         case EXTRA_HEALING:
  73.             message("you begin to feel much better", 0);
  74.             potion_heal(1);
  75.             break;
  76.         case POISON:
  77.             if (!sustain_strength) {
  78.                 rogue.str_current -= get_rand(1, 3);
  79.                 if (rogue.str_current < 1) {
  80.                     rogue.str_current = 1;
  81.                 }
  82.             }
  83.             message("you feel very sick now", 0);
  84.             if (halluc) {
  85.                 unhallucinate();
  86.             }
  87.             break;
  88.         case RAISE_LEVEL:
  89.             rogue.exp_points = level_points[rogue.exp - 1];
  90.             add_exp(1, 1);
  91.             break;
  92.         case BLINDNESS:
  93.             go_blind();
  94.             break;
  95.         case HALLUCINATION:
  96.             message("oh wow, everything seems so cosmic", 0);
  97.             halluc += get_rand(500, 800);
  98.             break;
  99.         case DETECT_MONSTER:
  100.             show_monsters();
  101.             if (!(level_monsters.next_monster)) {
  102.                 message(strange_feeling, 0);
  103.             }
  104.             break;
  105.         case DETECT_OBJECTS:
  106.             if (level_objects.next_object) {
  107.                 if (!blind) {
  108.                     show_objects();
  109.                 }
  110.             } else {
  111.                 message(strange_feeling, 0);
  112.             }
  113.             break;
  114.         case CONFUSION:
  115.             message((halluc ? "what a trippy feeling" :
  116.             "you feel confused"), 0);
  117.             confuse();
  118.             break;
  119.         case LEVITATION:
  120.             message("you start to float in the air", 0);
  121.             levitate += get_rand(15, 30);
  122.             being_held = bear_trap = 0;
  123.             break;
  124.         case HASTE_SELF:
  125.             message("you feel yourself moving much faster", 0);
  126.             haste_self += get_rand(11, 21);
  127.             if (!(haste_self % 2)) {
  128.                 haste_self++;
  129.             }
  130.             break;
  131.         case SEE_INVISIBLE:
  132.             sprintf(buf, "hmm, this potion tastes like %sjuice", fruit);
  133.             message(buf, 0);
  134.             if (blind) {
  135.                 unblind();
  136.             }
  137.             see_invisible = 1;
  138.             relight();
  139.             break;
  140.     }
  141.     print_stats((STAT_STRENGTH | STAT_HP));
  142.     if (id_potions[obj->which_kind].id_status != CALLED) {
  143.         id_potions[obj->which_kind].id_status = IDENTIFIED;
  144.     }
  145.     vanish(obj, 1, &rogue.pack);
  146. }
  147.  
  148. read_scroll()
  149. {
  150.     short ch;
  151.     object *obj;
  152.     char msg[DCOLS];
  153.  
  154.     if(blind)
  155.     {
  156.         message("You can't see to read the scroll.",0);
  157.         return;
  158.     }
  159.  
  160.     ch = pack_letter("read what?", SCROLL);
  161.  
  162.     if (ch == CANCEL) {
  163.         return;
  164.     }
  165.     if (!(obj = get_letter_object(ch))) {
  166.         message("no such item.", 0);
  167.         return;
  168.     }
  169.     if (obj->what_is != SCROLL) {
  170.         message("you can't read that", 0);
  171.         return;
  172.     }
  173.     switch(obj->which_kind) {
  174.         case SCARE_MONSTER:
  175.             message("you hear a maniacal laughter in the distance",
  176.             0);
  177.             break;
  178.         case HOLD_MONSTER:
  179.             hold_monster();
  180.             break;
  181.         case ENCH_WEAPON:
  182.             if (rogue.weapon) {
  183.                 if (rogue.weapon->what_is == WEAPON) {
  184.                     sprintf(msg, "your %sglow%s %sfor a moment",
  185.                     name_of(rogue.weapon),
  186.                     ((rogue.weapon->quantity <= 1) ? "s" : ""),
  187.                     get_ench_color());
  188.                     message(msg, 0);
  189.                     if (coin_toss()) {
  190.                         rogue.weapon->hit_enchant++;
  191.                     } else {
  192.                         rogue.weapon->d_enchant++;
  193.                     }
  194.                 }
  195.                 rogue.weapon->is_cursed = 0;
  196.             } else {
  197.                 message("your hands tingle", 0);
  198.             }
  199.             break;
  200.         case ENCH_ARMOR:
  201.             if (rogue.armor) {
  202.                 sprintf(msg, "your armor glows %sfor a moment",
  203.                 get_ench_color());
  204.                 message(msg, 0);
  205.                 rogue.armor->d_enchant++;
  206.                 rogue.armor->is_cursed = 0;
  207.                 print_stats(STAT_ARMOR);
  208.             } else {
  209.                 message("your skin crawls", 0);
  210.             }
  211.             break;
  212.         case IDENTIFY:
  213.             message("this is a scroll of identify", 0);
  214.             obj->identified = 1;
  215.             id_scrolls[obj->which_kind].id_status = IDENTIFIED;
  216.             idntfy();
  217.             break;
  218.         case TELEPORT:
  219.             tele();
  220.             break;
  221.         case SLEEP:
  222.             message("you fall asleep", 0);
  223.             take_a_nap();
  224.             break;
  225.         case PROTECT_ARMOR:
  226.             if (rogue.armor) {
  227.                 message( "your armor is covered by a shimmering gold shield",0);
  228.                 rogue.armor->is_protected = 1;
  229.                 rogue.armor->is_cursed = 0;
  230.             } else {
  231.                 message("your acne seems to have disappeared", 0);
  232.             }
  233.             break;
  234.         case REMOVE_CURSE:
  235.                 message((!halluc) ?
  236.                     "you feel as though someone is watching over you" :
  237.                     "you feel in touch with the universal oneness", 0);
  238.             uncurse_all();
  239.             break;
  240.         case CREATE_MONSTER:
  241.             create_monster();
  242.             break;
  243.         case AGGRAVATE_MONSTER:
  244.             aggravate();
  245.             break;
  246.         case MAGIC_MAPPING:
  247.             message("this scroll seems to have a map on it", 0);
  248.             draw_magic_map();
  249.             break;
  250.     }
  251.     if (id_scrolls[obj->which_kind].id_status != CALLED) {
  252.         id_scrolls[obj->which_kind].id_status = IDENTIFIED;
  253.     }
  254.     vanish(obj, (obj->which_kind != SLEEP), &rogue.pack);
  255. }
  256.  
  257. /* vanish() does NOT handle a quiver of weapons with more than one
  258.    arrow (or whatever) in the quiver.  It will only decrement the count.
  259. */
  260.  
  261. vanish(obj, rm, pack)
  262. object *obj;
  263. short rm;
  264. object *pack;
  265. {
  266.     if (obj->quantity > 1) {
  267.         obj->quantity--;
  268.     } else {
  269.         if (obj->in_use_flags & BEING_WIELDED) {
  270.             unwield(obj);
  271.         } else if (obj->in_use_flags & BEING_WORN) {
  272.             unwear(obj);
  273.         } else if (obj->in_use_flags & ON_EITHER_HAND) {
  274.             un_put_on(obj);
  275.         }
  276.         take_from_pack(obj, pack);
  277.         free_object(obj);
  278.     }
  279.     if (rm) {
  280.         (void) reg_move();
  281.     }
  282. }
  283.  
  284. potion_heal(extra)
  285. {
  286.     int ratio;
  287.     short add;
  288.  
  289.     rogue.hp_current += rogue.exp;
  290.  
  291.     ratio = (rogue.hp_current) / rogue.hp_max;
  292.  
  293.     if (ratio >= 1.00) {
  294.         rogue.hp_max += (extra ? 2 : 1);
  295.         extra_hp += (extra ? 2 : 1);
  296.         rogue.hp_current = rogue.hp_max;
  297.     } else if (ratio >= 0.90) {
  298.         rogue.hp_max += (extra ? 1 : 0);
  299.         extra_hp += (extra ? 1 : 0);
  300.         rogue.hp_current = rogue.hp_max;
  301.     } else {
  302.         if (ratio < 0.33) {
  303.             ratio = 0.33;
  304.         }
  305.         if (extra) {
  306.             ratio += ratio;
  307.         }
  308.         add = (short)(ratio * (rogue.hp_max - rogue.hp_current));
  309.         rogue.hp_current += add;
  310.         if (rogue.hp_current > rogue.hp_max) {
  311.             rogue.hp_current = rogue.hp_max;
  312.         }
  313.     }
  314.     if (blind) {
  315.         unblind();
  316.     }
  317.     if (confused && extra) {
  318.             unconfuse();
  319.     } else if (confused) {
  320.         confused = (confused / 2) + 1;
  321.     }
  322.     if (halluc && extra) {
  323.         unhallucinate();
  324.     } else if (halluc) {
  325.         halluc = (halluc / 2) + 1;
  326.     }
  327. }
  328.  
  329. idntfy()
  330. {
  331.     short ch;
  332.     object *obj;
  333.     struct id *id_table;
  334.     char desc[DCOLS];
  335. AGAIN:
  336.     ch = pack_letter("what would you like to identify?", ALL_OBJECTS);
  337.  
  338.     if (ch == CANCEL) {
  339.         return;
  340.     }
  341.     if (!(obj = get_letter_object(ch))) {
  342.         message("no such item, try again", 0);
  343.         message("", 0);
  344.         check_message();
  345.         goto AGAIN;
  346.     }
  347.     obj->identified = 1;
  348.     if (obj->what_is & (SCROLL | POTION | WEAPON | ARMOR | WAND | RING)) {
  349.         id_table = get_id_table(obj);
  350.         id_table[obj->which_kind].id_status = IDENTIFIED;
  351.     }
  352.     get_desc(obj, desc);
  353.     message(desc, 0);
  354. }
  355.  
  356. eat()
  357. {
  358.     short ch;
  359.     short moves;
  360.     object *obj;
  361.     char buf[70];
  362.  
  363.     ch = pack_letter("eat what?", FOOD);
  364.  
  365.     if (ch == CANCEL) {
  366.         return;
  367.     }
  368.     if (!(obj = get_letter_object(ch))) {
  369.         message("no such item.", 0);
  370.         return;
  371.     }
  372.     if (obj->what_is != FOOD) {
  373.         message("you can't eat that", 0);
  374.         return;
  375.     }
  376.     if ((obj->which_kind == FRUIT) || rand_percent(60)) {
  377.         moves = get_rand(900, 1100);
  378.         if (obj->which_kind == RATION) {
  379.             message("yum, that tasted good", 0);
  380.         } else {
  381.             sprintf(buf, "my, that was a yummy %s", fruit);
  382.             message(buf, 0);
  383.         }
  384.     } else {
  385.         moves = get_rand(700, 900);
  386.         message("yuk, that food tasted awful", 0);
  387.         add_exp(2, 1);
  388.     }
  389.     rogue.moves_left /= 3;
  390.     rogue.moves_left += moves;
  391.     hunger_str[0] = 0;
  392.     print_stats(STAT_HUNGER);
  393.  
  394.     vanish(obj, 1, &rogue.pack);
  395. }
  396.  
  397. hold_monster()
  398. {
  399.     short i, j;
  400.     short mcount = 0;
  401.     object *monster;
  402.     short row, col;
  403.  
  404.     for (i = -2; i <= 2; i++) {
  405.         for (j = -2; j <= 2; j++) {
  406.             row = rogue.row + i;
  407.             col = rogue.col + j;
  408.             if ((row < MIN_ROW) || (row > (DROWS-2)) || (col < 0) ||
  409.                  (col > (DCOLS-1))) {
  410.                 continue;
  411.             }
  412.             if (dungeon[row][col] & MONSTER) {
  413.                 monster = object_at(&level_monsters, row, col);
  414.                 monster->m_flags |= ASLEEP;
  415.                 monster->m_flags &= (~WAKENS);
  416.                 mcount++;
  417.             }
  418.         }
  419.     }
  420.     if (mcount == 0) {
  421.         message("you feel a strange sense of loss", 0);
  422.     } else if (mcount == 1) {
  423.         message("the monster freezes", 0);
  424.     } else {
  425.         message("the monsters around you freeze", 0);
  426.     }
  427. }
  428.  
  429. tele()
  430. {
  431.     mvaddch(rogue.row, rogue.col, get_dungeon_char(rogue.row, rogue.col));
  432.  
  433.     if (cur_room >= 0) {
  434.         darken_room(cur_room);
  435.     }
  436.     put_player(get_room_number(rogue.row, rogue.col));
  437.     being_held = 0;
  438.     bear_trap = 0;
  439. }
  440.  
  441. hallucinate()
  442. {
  443.     object *obj, *monster;
  444.     short ch;
  445.  
  446.     if (blind) return;
  447.  
  448.     obj = level_objects.next_object;
  449.  
  450.     while (obj) {
  451.         ch = mvinch(obj->row, obj->col);
  452.         if (((ch < 'A') || (ch > 'Z')) &&
  453.             ((obj->row != rogue.row) || (obj->col != rogue.col)))
  454.         if ((ch != ' ') && (ch != '.') && (ch != '#') && (ch != '+')) {
  455.             addch(gr_obj_char());
  456.         }
  457.         obj = obj->next_object;
  458.     }
  459.     monster = level_monsters.next_monster;
  460.  
  461.     while (monster) {
  462.         ch = mvinch(monster->row, monster->col);
  463.         if ((ch >= 'A') && (ch <= 'Z')) {
  464.             addch(get_rand('A', 'Z'));
  465.         }
  466.         monster = monster->next_monster;
  467.     }
  468. }
  469.  
  470. unhallucinate()
  471. {
  472.     halluc = 0;
  473.     relight();
  474.     message("everything looks SO boring now", 1);
  475. }
  476.  
  477. unblind()
  478. {
  479.     blind = 0;
  480.     message("the veil of darkness lifts", 1);
  481.     relight();
  482.     if (halluc) {
  483.         hallucinate();
  484.     }
  485.     if (detect_monster) {
  486.         show_monsters();
  487.     }
  488. }
  489.  
  490. relight()
  491. {
  492.     if (cur_room == PASSAGE) {
  493.         light_passage(rogue.row, rogue.col);
  494.     } else {
  495.         light_up_room(cur_room);
  496.     }
  497.     mvaddch(rogue.row, rogue.col, rogue.fchar);
  498. }
  499.  
  500. take_a_nap()
  501. {
  502.     short i;
  503.  
  504.     i = get_rand(2, 5);
  505.     md_sleep(1);
  506.  
  507.     while (i--) {
  508.         mv_mons();
  509.     }
  510.     md_sleep(1);
  511.     message(you_can_move_again, 0);
  512. }
  513.  
  514. go_blind()
  515. {
  516.     short i, j;
  517.  
  518.     if (!blind) {
  519.         message("a cloak of darkness falls around you", 0);
  520.     }
  521.     blind += get_rand(500, 800);
  522.  
  523.     if (detect_monster) {
  524.         object *monster;
  525.  
  526.         monster = level_monsters.next_monster;
  527.  
  528.         while (monster) {
  529.             mvaddch(monster->row, monster->col, monster->trail_char);
  530.             monster = monster->next_monster;
  531.         }
  532.     }
  533.     if (cur_room >= 0) {
  534.         for (i = rooms[cur_room].top_row + 1;
  535.              i < rooms[cur_room].bottom_row; i++) {
  536.             for (j = rooms[cur_room].left_col + 1;
  537.                  j < rooms[cur_room].right_col; j++) {
  538.                 mvaddch(i, j, ' ');
  539.             }
  540.         }
  541.     }
  542.     mvaddch(rogue.row, rogue.col, rogue.fchar);
  543. }
  544.  
  545. char *
  546. get_ench_color()
  547. {
  548.     if (halluc) {
  549.         return(id_potions[get_rand(0, POTIONS-1)].title);
  550.     }
  551.     return("blue ");
  552. }
  553.  
  554. confuse()
  555. {
  556.     confused += get_rand(12, 22);
  557. }
  558.  
  559. unconfuse()
  560. {
  561.     char msg[80];
  562.  
  563.     confused = 0;
  564.     sprintf(msg, "you feel less %s now", (halluc ? "trippy" : "confused"));
  565.     message(msg, 1);
  566. }
  567.  
  568. uncurse_all()
  569. {
  570.     object *obj;
  571.  
  572.     obj = rogue.pack.next_object;
  573.  
  574.     while (obj) {
  575.         obj->is_cursed = 0;
  576.         obj = obj->next_object;
  577.     }
  578. }
  579.